/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package issr.boundary;

import com.vaadin.data.Item;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import issr.boundary.vaadin.AbstractView;
import issr.boundary.vaadin.MainApplication;
import issr.controller.ControlloreErogazioneProdotti;
import issr.controller.ControlloreErogazioneProdotti_Service;
import issr.controller.Prodotto;
import issr.controller.Utente;
import issr.misc.Labels;
import java.util.ArrayList;

/**
 *
 * @author Francesco
 */
public class PannelloErogazioneProdotti extends AbstractView implements Button.ClickListener {

    private ControlloreErogazioneProdotti_Service cls;
    private ControlloreErogazioneProdotti controllore;
    private final VerticalLayout layout;
    private final TextField codiceField = new TextField(Labels.CODICE_A_BARRE_GS1);
    private final TextField quantitaField = new TextField(Labels.QUANTITA);
    private final IndexedContainer prodottiContainer;
    private final Table textTable;
    private Button submit;
    private Button add;
    private int contatore = 0;

    public PannelloErogazioneProdotti() {
        cls = new ControlloreErogazioneProdotti_Service();
        controllore = cls.getControlloreErogazioneProdottiPort();
        
        layout = new VerticalLayout();
        textTable = new Table();

        setSizeFull();
        setCompositionRoot(layout);
        layout.setHeight("100%");
        layout.setWidth("100%");
        layout.setSpacing(true);
        layout.setMargin(true);

        textTable.setWidth("100%");
        textTable.setHeight("100%");
        textTable.setPageLength(0);
        textTable.setImmediate(true);

        prodottiContainer = new IndexedContainer();
        prodottiContainer.addContainerProperty(Labels.PRODOTTO, Prodotto.class, null);

        textTable.setContainerDataSource(prodottiContainer);
        
        add = new Button("Aggiungi", this);
        submit = new Button("Eroga", this);

        HorizontalLayout hlayout = new HorizontalLayout();
        hlayout.setHeight("150");
        hlayout.setWidth("70%");
        hlayout.setSpacing(true);
        hlayout.setMargin(true);
        
        codiceField.setRequired(true);
        quantitaField.setRequired(true);
        hlayout.addComponent(codiceField);
        hlayout.addComponent(quantitaField);
        
        hlayout.addComponent(add);
        hlayout.addComponent(submit);

        layout.addComponent(textTable);
        layout.addComponent(hlayout);
    }

    protected void resetForm() {
        codiceField.setValue("");
        quantitaField.setValue("");
        textTable.removeAllItems();
    }

    protected void visualizzaForm() {
        resetForm();
    }

    @Override
    protected void open() throws Exception {
    }

    @Override
    protected void close() throws Exception {
    }

    @Override
    public void buttonClick(ClickEvent event) {
        if (event.getButton().getCaption().equals("Aggiungi")) {
            Object object = controllore.richiestaErogazioneProdotto(
                    Integer.parseInt((String) codiceField.getValue()),
                    Integer.parseInt((String) quantitaField.getValue()),
                    (Utente) MainApplication.getProject().getUser());
            if (object == null) {
                MainApplication.getProject().getMainWindow().showNotification(
                        "Lotto non esistente nel sistema");
            } else if (object instanceof Prodotto) {
                Prodotto prodotto = (Prodotto) object;
                Item item = prodottiContainer.addItem(contatore);
                item.getItemProperty(Labels.PRODOTTO).setValue(prodotto);
                contatore++;
            } else if (object instanceof Integer) {
                Integer codiceErrore = (Integer) object;
                if (codiceErrore == -1) {
                    MainApplication.getProject().getMainWindow().showNotification(
                            "Lotto " + (String) codiceField.getValue() + " scaduto e rimosso");
                } else {
                    MainApplication.getProject().getMainWindow().showNotification(
                            "Disponibilità massima è " + codiceErrore + " prodotti");
                }
            }
        } else if (event.getButton().getCaption().equals("Eroga")) {
            ArrayList<Prodotto> prodottiDaErogare = new ArrayList<Prodotto>();
            for (int i = 0; i < prodottiContainer.size(); i++) {
                Item tmp = prodottiContainer.getItem(i);
                prodottiDaErogare.add((Prodotto) tmp.getItemProperty(Labels.PRODOTTO).getValue());
            }
            MainApplication.getProject().getMainWindow().showNotification(
                    "Prodotti erogati con successo");
            controllore.preparaFattura(prodottiDaErogare);
        }
    }
}
